/**
 * 编辑器对象
 */
function sEditor(){
    var document = new sDocument();

    /**
     * 构造编辑器
     * @param {*} opt {container: [selector]}
     */
    this.build = function(opt){
        document.setContainer(opt.container);

        var param = null;

        try{
            param = {
                diffUtil: new sDiffUtil(),
                scriptFuncs: new sScriptFuncs(this.executeCommand)
            }
        }catch(e){
            console.error(e);
        }

        var processor = new sProcessor(param);

        document.setProcessor(processor);
        document.build(opt);

        document.registComponent([
            new scCalendar()
        ]);

        return this;
    }

    /**
     * 加载json格式的数据
     * @param {*} json 
     * @param {*} opt
     */
    this.load = function(json, opt){
        document.load(json, opt);
    }

    /**
     * 导出数据文件
     */
    this.exportFile = function() {
        document.exportFile();
    }

    /**
     * 导出HTML
     * @param {*} opt
     */
    this.exportHTML = function(opt) {
        document.exportHTML(opt);
    }

    /**
     * 加载文件
     */
    this.loadFile = function() {
        document.loadFile();
    }

    /**
     * 打印
     * @param {*} opt 
     */
    this.print = function(opt) {
        document.print(opt);
    }

    /**
     * 设置编辑器大小
     * @param size  {width:0, height:0}
     */
    this.setSize = function(size) {
        document.setSize(size);
    }

    /**
     * 执行命令
     * @param {*} name 
     * @param {*} value 
     * @param {*} opt 
     */
    this.executeCommand = function(name, value, opt){
        if(!ssDict.sMenuCommands[name]) return false;

        var method = document[ssDict.sMenuCommands[name].method];
        if(!method) return false;

        return method.call(document, value, opt);
    }

    /**
     * 添加事件监听
     * @param {*} name 事件类型名称
     * @param {*} callback 回调方法
     * @param {*} option 可选项
     */
    this.addEventListener = function(name, callback, option){
        document.addEventListener(name, callback, option);
    }

    /**
     * 添加多个事件监听
     * @param {*} name 事件类型名称
     * @param {*} callback 回调方法
     * @param {*} option 可选项
     */
    this.addEventListeners = function(name, callback, option){
        document.addEventListeners(name, callback, option);
    }

    /**
     * 对dom节点添加调整大小的监听方法
     * @param {*} node 
     * @param {*} callback 
     */
    this.addResizeObserver = function(node, callback){
        document.addResizeObserver(node, callback);
    }

    /**
     * 定义文档引用只读属性
     */
    Object.defineProperty(this, "document", {
        writable: false,
        configurable: false,
        value: document
    });
} 

/**
 * 获取一个编辑器实例化对象
 * @returns 
 */
sEditor.instance = function(){
    return new sEditor();
}